#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QJsonObject>
#include <QJsonDocument>
#include <QMessageBox>
#include <QTimer>
#include <QJsonArray>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //连接服务器
//    socket = new QTcpSocket(this);
//    socket->connectToHost("3w4z340113.wicp.vip",35785);

    //定义信号与槽，接收服务器发送的数据
//    connect(socket, &QTcpSocket::readyRead, this, &MainWindow::readyRead);

}

MainWindow::~MainWindow()
{
    delete ui;
    socket->close();
}

void MainWindow::init()
{
    qDebug() << "进入主界面";
    ui->label_warning->setText("服务器连接成功!");
    timer_reConn=new QTimer(this);
    connect_flag = 1;

    //重连定时器
    connect(timer_reConn, &QTimer::timeout, this, &MainWindow::dis_ReConnect);
    //发送文本框事件过滤器，识别回车和回车+ctrl
    ui->plainTextEdit_2->installEventFilter(this);//设置完后自动调用其eventFilter函数

    connect(ui->plainTextEdit_2,SIGNAL(textChanged()),this,SLOT(slot_textChange()));
}

//文本框高度自适应
void MainWindow::slot_textChange()
{
//    QTextDocument *document = ui->plainTextEdit_2->document();
//    if(document->size().height() < 3)
//        ui->plainTextEdit_2->setFixedHeight(document->size().height()+2);
}

//发送文本框事件过滤器，识别回车和回车+ctrl
bool MainWindow::eventFilter(QObject *target, QEvent *event)
{
    if(target == ui->plainTextEdit_2)
    {
        if(event->type() == QEvent::KeyPress) //回车键
        {
             QKeyEvent *k = static_cast<QKeyEvent *>(event);
             //按下回车的同时，判断是否按下了ctrl
             if(k->key() == Qt::Key_Return)
             {
                 //判断是否是ctrl+回车
                 if(k->modifiers() & Qt::ControlModifier){
                    ui->plainTextEdit_2->insertPlainText("\n");
                 }
                 //如果是直接按回车，则发送
                 else{
                     on_pushButton_clicked();
                     return true;
                 }
             }
        }
    }
    return QWidget::eventFilter(target,event);
}

/*
    登录界面传递的参数
    1.服务器端的套接字
    2.客户端的套接字
    3.登录名
    4.服务器地址
    5.服务器端口
*/
void MainWindow::getLogin_data(int con, QTcpSocket *sockfd, QString na,QString addr, int por)
{
    connfd = con;
    socket = sockfd;
    name = na;
    ip_addr = addr;
    port = por;
    qDebug() << "接收到登录界面传递的信息";
    connect(socket, &QTcpSocket::readyRead, this, &MainWindow::readyRead);
    connect(socket, &QTcpSocket::disconnected, this,&MainWindow::isDisConnection);//断线
}

/*处理服务器转发过来的数据*/
void MainWindow::readyRead()
{
    //获取服务器发送的内容
    QByteArray array = socket->readAll();
    //QByteArray转QString
    QString data = array;
    if(data != NULL){
        qDebug() << "接收到服务器数据：" << data;
        /*处理json数据*/
        QJsonDocument doc = QJsonDocument::fromJson(array);
//        QJsonObject obj = doc.object();
        //获取数据类型
        QString type_value = doc["type"].toString();

        //如果是聊天信息
        if(type_value == "chat_all"){
            //获取data键值
            QString data_value = doc["data"].toString();
//            QApplication::beep();           //发出提示音
            ui->plainTextEdit->appendPlainText(data_value);
        }
        //如果是在线用户列表信息
        else if(type_value == "online_users"){
            //获取data键值
            QJsonArray online_users;
            online_users = doc["online_users"].toArray();
            qDebug() << "online_users = " << online_users;
            QString all_users;
            //保存所有在线用户
            int id = online_users.size();
            foreach (QJsonValue var, online_users) {
                //由于服务器存储在线用户采用的链表头插法，所以这里倒序合并字符串，即是 + all_users 而不是 all_users +
                all_users = QString::number(id) + ":" + var.toString() + all_users;
                all_users = "\n" + all_users;
                id--;
            }
            //在线用户显示在UI上
            ui->label_all_user->setText(all_users);
        }
    }
}

/*发送文本数据到服务器*/
void MainWindow::on_pushButton_clicked()
{
    QString data = ui->plainTextEdit_2->toPlainText();
//    socket->write(data.toUtf8().data());  // 防止中文乱码

    if(data == NULL)
        return;

    /*将json注册信息发送到服务器*/
    QJsonObject jsonObject;
    jsonObject.insert("type", "chat_all");  //聊天类型：群聊
    jsonObject.insert("data", data);
    jsonObject.insert("name", name);
    jsonObject.insert("connfd", connfd);

    QJsonDocument jsonDocument;
    jsonDocument.setObject(jsonObject);
    QByteArray dataArray = jsonDocument.toJson();

//    qDebug() << jsonObject;
//    qDebug() << dataArray;

    /*将注册信息发送到服务器*/
    socket->write(dataArray.toStdString().data());

    ui->plainTextEdit_2->clear();
}

/*服务器断连*/
void MainWindow::isDisConnection()
{
    qDebug()<<"*******断开*******";
    connect_flag = 0;
    ui->label_warning->setText("服务器断开!");
    timer_reConn->start(5000);  //开启重连定时器
}

/*断线重连服务器*/
void MainWindow::dis_ReConnect()
{
    if(socket->state() == QAbstractSocket::UnconnectedState)
    {
        qDebug()<<"断线重连";
        socket->abort();
        socket->connectToHost(ip_addr, port);
    }
    // 连接成功后关闭初始化连接定时器
    else if(socket->state() == QAbstractSocket::ConnectedState)
    {
        connect_flag = 1;
        ui->label_warning->setText("服务器连接成功!");
        timer_reConn->stop();
//        QMessageBox::information(this,
//                            tr("提示"),
//                            tr("服务器重连成功！"),
//                            QMessageBox::Ok,
//                            QMessageBox::Ok);
    }
}
